﻿using B.S.BaseData.Domain.Entities;
using B.S.BaseData.Domain.Entities.Logs;
using B.S.BaseData.Domain.Entities.Meeting;
using B.S.BaseData.Domain.Entities.RBAC;
using B.S.BaseData.Domain.OrmTest;
using Microsoft.EntityFrameworkCore;

namespace B.S.BaseData.Infrastructure
{
    public class BaseDbContext : DbContext
    {
        public BaseDbContext(DbContextOptions options) : base(options)
        {
        }

        public DbSet<User> Users { get; set; }
        public DbSet<Role> Roles { get; set; }
        public DbSet<UserRole> UserRoles { get; set; }
        public DbSet<Permission> Permissions { get; set; }
        public DbSet<RolePermission> RolePermissions { get; set; }
        public DbSet<Department> Departments { get; set; }
        //public DbSet<ApprovalLog> ApprovalLogs { get; set; }
        //public DbSet<LoginLog> LoginLogs { get; set; }
        public DbSet<OperationLog> OperationLogs { get; set; }
        public DbSet<MeetingReservation> MeetingReservations { get; set; }
        public DbSet<MeetingRoom> MeetingRooms { get; set; }
        public DbSet<MeetingApproval> MeetingApprovals { get; set; }
        public DbSet<TestDemo> TestDemos { get; set; }//测试 自定义orm
        //public DbSet<UserDepartment> UserDepartments { get; set; }


        protected override void OnModelCreating(ModelBuilder modelBuilder)
        {


            //重写 EF Core 的模型构建方法，先调用基类方法，保证原有配置不丢失。
            base.OnModelCreating(modelBuilder);

          

            //modelBuilder.Entity<BaseEntity>().HasQueryFilter(x => !x.IsDelete);


            // 自动为所有继承自 BaseEntity 的实体加上 IsDelete == false 的全局过滤器
            foreach (var entityType in modelBuilder.Model.GetEntityTypes())
            {
                // 判断是否继承自 BaseEntity，且不是抽象类
                if (typeof(BaseEntity).IsAssignableFrom(entityType.ClrType) && !entityType.ClrType.IsAbstract)
                {
                    // 构建表达式 x => !x.IsDelete
                    //创建一个参数 x，类型为当前实体类型（如 User、Role 等）。
                    var parameter = System.Linq.Expressions.Expression.Parameter(entityType.ClrType, "x");
                    //获取当前实体类型的 IsDelete 属性。
                    var property = System.Linq.Expressions.Expression.Property(parameter, nameof(BaseEntity.IsDelete));
                    //创建一个表达式，表示 IsDelete 属性等于 false。
                    var compare = System.Linq.Expressions.Expression.Equal(property, System.Linq.Expressions.Expression.Constant(false));
                    //创建一个 Lambda 表达式，表示 x => !x.IsDelete。
                    var lambda = System.Linq.Expressions.Expression.Lambda(compare, parameter);
                    //将这个 Lambda 表达式作为查询过滤器应用到当前实体类型上。
                    entityType.SetQueryFilter(lambda);
                }
            }
        }

    }
}
